var obj = {
    hi() {// es6 对象字面量的简写方式
        console.log(this, '---');
        // 返回值是一个函数————高阶函数
        // 箭头函数 没有this
        return () => {
            console.log(this, '+++');
            return function () {
                console.log(this, 'xxx');
            }
        }
    },
    sayHi: function () {
        return function () {
            console.log(this, '---');

            return () => {
                console.log(this, '+++');
            }
        }
    },
    say: () => {
        console.log(this);
    },
    sayHiHi: function () {
        return function () {
            console.log(this, '---');
            return function () {
                console.log(this, '+++');
                return function () {
                    console.log(this, 'xxx');
                }
            }
        }
    }
}

// obj.sayHiHi()()()();//w--- w+++ wxxx

// const func = obj.hi;// 作为对象把整个函数赋值到左侧!  变成普通函数
// func();//调用方式，是普通函数 window
// const innerFunc = func();// 把函数的返回值赋值给左侧!
// innerFunc();//调用位置 w 返回 箭头函数时 this 找外层

// obj.hi()();//返回 箭头函数时 this-》obj    obj--- obj+++
//obj.hi()()();//obj--- obj+++ wxxx

//以下代码一段一段执行,空行表示新的一段代码,执行一段代码时,注释其他所有段落代码:(2.js和3.js全在这)

//obj.sayHi();// 1.直接调用 obj.sayHi(); 什么都没输出   ①为什么什么都不输出?————高阶函数（待定）
// obj.sayHi()();//输出 w---
// obj.sayHi()()();//输出 w--- w+++

//obj.hi();// 2.直接调用obj.hi(); 输出 obj---

// let hi = obj.hi();// 3.赋值操作 输出 obj---  ②赋值时会运行赋值操作右边的函数吗?
// hi();// 调用hi(); 输出obj+++


// let sayHi = obj.sayHi();// 4.无输出
// sayHi();// 输出 一个 window---

// let sayHi = obj.sayHi();// 5.  ③请解释一下这整段代码,每一句操作运行时,函数内部是怎么执行的?
// let fun1 = sayHi();// 赋值操作 输出 window---// 到这一步相当于obj.sayHi()();
// fun1();// 调用fun1(); 输出一个 window+++// 到这一步相当于obj.sayHi()()();
// ④ [猜想] 调用栈 obj.sayHi->w.sayHi->w.fun1 第二个元素就是调用位置 调用位置上下文处于window,所以是this指向window吗?（

//obj.say();// 6.输出 window

// let sayHi = obj.sayHi(); // 7.(3.js里的代码)
// let fun1 = sayHi(); //赋值操作 输出 window
// fun1(); // 调用fun1(); 输出一个 window
// let fun2 = sayHi.bind(obj)(); //赋值操作 输出 obj
// fun2();// 调用fun2(); 输出一个 obj